﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
// 原题连接：https://www.luogu.com.cn/problem/P1009
/*
题目描述：
题目描述
用高精度计算出
�
=
1
!
+
2
!
+
3
!
+
⋯
+
�
!
S=1!+2!+3!+⋯+n!（
�
≤
50
n≤50）。

其中 ! 表示阶乘，定义为
�
!
=
�
×
(
�
−
1
)
×
(
�
−
2
)
×
⋯
×
1
n!=n×(n−1)×(n−2)×⋯×1。例如，
5
!
=
5
×
4
×
3
×
2
×
1
=
120
5!=5×4×3×2×1=120。

输入格式
一个正整数
�
n。

输出格式
一个正整数
�
S，表示计算结果。
*/

// 高精度加法
string addStrings(string num1, string num2) {
    int end1 = num1.size() - 1;
    int end2 = num2.size() - 1;
    // 结果字符串
    string retStr;

    // 进位
    int next = 0;

    while (end1 >= 0 || end2 >= 0) {
        int x1 = end1 >= 0 ? num1[end1] - '0' : 0;
        int x2 = end2 >= 0 ? num2[end2] - '0' : 0;
        int ret = x1 + x2 + next;
        next = ret / 10;
        ret = ret % 10;

        // 尾插
        retStr += ('0' + ret);
        end1--;
        end2--;
    }
    if (next) {
        retStr += '1';
    }
    // 最后再逆置
    reverse(retStr.begin(), retStr.end());
    return retStr;
}

// 高精度乘法
string multiply(string num1, string num2) {
    // 各种特判
    if (num1.size() == 0) {
        return num2;
    }
    if (num2.size() == 0) {
        return num1;
    }
    if ("0" == num1 || "0" == num2) {
        return "0";
    }
    if ("1" == num1) {
        return num2;
    }
    if ("1" == num2) {
        return num1;
    }

    int n = num1.size(), m = num2.size();
    // 先将两个字符串进行逆序
    reverse(num1.begin(), num1.end());
    reverse(num2.begin(), num2.end());
    vector<int> temp(n + m - 1);
    string ret;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            temp[i + j] += (num1[i] - '0') * (num2[j] - '0');
        }
    }
    // 处理进位
    int cur = 0, t = 0;
    while (cur < n + m - 1 || t != 0) {
        if (cur < n + m - 1) {
            t += temp[cur++];
        }
        ret += t % 10 + '0';
        t /= 10;
    }
    // 处理前导零
    while (ret.back() == '0') {
        ret.pop_back();
    }
    reverse(ret.begin(), ret.end()); // 反转
    return ret;
}










int main() {
    int N = 0;
    cin >> N;
    vector<string> dp(N + 1);
    // 初始化
    dp[0] = dp[1] = "1";

    string ret = "1";
    // 填表
    for (int i = 2; i <= N; i++) {
        dp[i] = multiply(dp[i - 1], to_string(i));
        ret = addStrings(ret, dp[i]);
    }
    cout << ret << endl;

    return 0;
}